# Домашнее задание к занятию "`Базы данных`" - `Исаенков Евгений`

---

### Задание 1

Заказчик передал вам файл в формате Excel, в котором сформирован отчёт.

На основе этого отчёта нужно выполнить следующие задания.

Задание 1
Опишите не менее семи таблиц, из которых состоит база данных:

какие данные хранятся в этих таблицах;
какой тип данных у столбцов в этих таблицах, если данные хранятся в PostgreSQL.
Приведите решение к следующему виду:

Сотрудники (

идентификатор, первичный ключ, serial,
фамилия varchar(50),
...
идентификатор структурного подразделения, внешний ключ, integer).

### Ответ

Как предоставленные данные могут быть структурированы согласно ТЗ:
1. **Сотрудники**:
   - Идентификатор (primary key, serial)
   - Фамилия (varchar(50))
   - Имя (varchar(50))
   - Отчество (varchar(50))
   - Идентификатор должности (foreign key, integer)
   - Идентификатор структурного подразделения (foreign key, integer)
   - Оклад (integer)
   - Дата найма (date)

2. **Должность**:
   - Идентификатор (primary key, serial)
   - Название должности (varchar(100))

3. **Тип Подразделения**:
   - Идентификатор (primary key, serial)
   - Название типа (varchar(100))

4. **Структурное Подразделение**:
   - Идентификатор (primary key, serial)
   - Название подразделения (varchar(100))
   - Идентификатор типа подразделения (foreign key, integer)
   - Идентификатор адреса подразделения (foreign key, integer)

5. **Адрес (бывший Филиал)**:
   - Идентификатор (primary key, serial)
   - Адрес филиала (varchar(255))

6. **Проекты**:
   - Идентификатор (primary key, serial)
   - Название проекта (varchar(100))
   - Описание (text)
   - Дата начала (date)
   - Дата окончания (date, nullable)

7. **Назначение на Проекты**:
   - Идентификатор сотрудника (foreign key, integer)
   - Идентификатор проекта (foreign key, integer)

Запрос для создания таблицы в БД PostgreSQL
```sql
CREATE TABLE Employees (
    ID SERIAL PRIMARY KEY,
    LastName VARCHAR(50),
    FirstName VARCHAR(50),
    MiddleName VARCHAR(50),
    PositionID INTEGER,
    DepartmentID INTEGER,
    Salary DECIMAL,
    HireDate DATE,
    FOREIGN KEY (PositionID) REFERENCES Positions(ID),
    FOREIGN KEY (DepartmentID) REFERENCES Departments(ID)
);

CREATE TABLE Positions (
    ID SERIAL PRIMARY KEY,
    Name VARCHAR(100),
    Salary DECIMAL
);

CREATE TABLE DepartmentTypes (
    ID SERIAL PRIMARY KEY,
    Name VARCHAR(100)
);

CREATE TABLE Addresses (
    ID SERIAL PRIMARY KEY,
    Address VARCHAR(255)
);

CREATE TABLE Departments (
    ID SERIAL PRIMARY KEY,
    Name VARCHAR(100),
    TypeID INTEGER,
    AddressID INTEGER,
    FOREIGN KEY (TypeID) REFERENCES DepartmentTypes(ID),
    FOREIGN KEY (AddressID) REFERENCES Addresses(ID)
);

CREATE TABLE Projects (
    ID SERIAL PRIMARY KEY,
    Name VARCHAR(100),
    Description TEXT,
    StartDate DATE,
    EndDate DATE
);

CREATE TABLE ProjectAssignments (
    EmployeeID INTEGER,
    ProjectID INTEGER,
    PRIMARY KEY (EmployeeID, ProjectID),
    FOREIGN KEY (EmployeeID) REFERENCES Employees(ID),
    FOREIGN KEY (ProjectID) REFERENCES Projects(ID)
);
```

---

### Задание 2

Перечислите, какие, на ваш взгляд, в этой денормализованной таблице встречаются функциональные зависимости и какие правила вывода нужно применить, чтобы нормализовать данные.

### Ответ

 Исходя из данных в вашем Excel-файле можно выделить следующие функциональные зависимости и правила нормализации данных:

1. **Функциональные зависимости**:
   - **ФИО сотрудника от Должности, Оклада, Даты найма и Проекта**: Кажется, что эти данные уникальны для каждого сотрудника.
   - **Структурное подразделение от Типа подразделения и Адреса филиала**: Похоже, что каждое структурное подразделение относится к определенному типу и имеет определенный адрес.

2. **Правила нормализации**:
   - **Разделение информации о сотрудниках**: Данные можно нормализовать, выделив информацию, специфичную для сотрудников (такую как имя, должность, оклад, дата найма), в отдельную таблицу 'Сотрудники'.
   - **Информация о подразделениях**: Создать отдельную таблицу 'Подразделения', которая будет включать детали о каждом подразделении, такие как его тип и адрес.
   - **Назначение на проекты**: Если сотрудники могут быть назначены на несколько проектов, потребуется отдельная таблица для связи сотрудников и проектов.

Применение этих правил подразумевает создание таблиц для сотрудников, подразделений и проектов, а возможно, и связующей таблицы для сотрудников и проектов. Это уменьшит избыточность данных (например, повторение типа и адреса подразделения для каждого сотрудника) и повысит эффективность базы данных.